
module ULA where

import Graphics.UI.GLUT

-- Pontos dos vertices da ULA
ponto0 :: Vertex3 GLfloat
ponto0 = (Vertex3 (-10) 5 (-5))

ponto1 :: Vertex3 GLfloat
ponto1 = (Vertex3 (-1) 5 (-5))

ponto2 :: Vertex3 GLfloat
ponto2 = (Vertex3 5 (-5) (-5))

ponto3 :: Vertex3 GLfloat
ponto3 = (Vertex3 (-5) (-5) (-5))

ponto4 :: Vertex3 GLfloat
ponto4 = (Vertex3 1 5 (-5))

ponto5 :: Vertex3 GLfloat
ponto5 = (Vertex3 10 5 (-5))

ponto6 :: Vertex3 GLfloat
ponto6 = (Vertex3 (-10) 5 5)

ponto7 :: Vertex3 GLfloat
ponto7 = (Vertex3 (-1) 5 5)

ponto8 :: Vertex3 GLfloat
ponto8 = (Vertex3 5 (-5) 5)

ponto9 :: Vertex3 GLfloat
ponto9 = (Vertex3 (-5) (-5) 5)

ponto10 :: Vertex3 GLfloat
ponto10 = (Vertex3 1 5 5)

ponto11 :: Vertex3 GLfloat
ponto11 = (Vertex3 10 5 5)

-- Make
makeUla :: Color4 GLfloat -> (GLfloat,GLfloat) -> String -> IO DisplayList
makeUla cor (x,y) operacao = do
	[listaUla] <- genObjectNames 1
	let vertex3f = vertex :: Vertex3 GLfloat -> IO ()
	defineList listaUla Compile $ do
		preservingMatrix $ do
			translate (Vector3 x y 10 :: Vector3 GLfloat)
			currentColor $= Color4 1 1 1 1
			materialAmbient Front $= Color4 1 1 1 1
			-- Escreve a operacao
			--lighting $= Disabled
			preservingMatrix $ do
				translate (Vector3 (-5) 0 5 :: Vector3 GLfloat)			
				scale 0.03 0.03 (0.03::GLfloat)
				renderString MonoRoman operacao
			--lighting $= Enabled
			currentColor $= cor
			materialAmbient Front $= cor
			-- frente1
			renderPrimitive Quads $ do
				vertex3f ponto0
				vertex3f ponto1
				vertex3f ponto2
				vertex3f ponto3
			-- frente2
			renderPrimitive Quads $ do
				vertex3f ponto4
				vertex3f ponto5
				vertex3f ponto2
				vertex3f ponto3		
			-- tras1
			renderPrimitive Quads $ do
				vertex3f ponto6
				vertex3f ponto7
				vertex3f ponto8
				vertex3f ponto9
			-- tras2
			renderPrimitive Quads $ do
				vertex3f ponto10
				vertex3f ponto11
				vertex3f ponto8
				vertex3f ponto9
			-- direita
			renderPrimitive Quads $ do
				vertex3f ponto0
				vertex3f ponto3
				vertex3f ponto9
				vertex3f ponto6
			-- esquerda
			renderPrimitive Quads $ do
				vertex3f ponto2
				vertex3f ponto5
				vertex3f ponto11
				vertex3f ponto8
			-- baixo		
			renderPrimitive Quads $ do
				vertex3f ponto3
				vertex3f ponto9
				vertex3f ponto8
				vertex3f ponto2
			-- cima1
			renderPrimitive Quads $ do
				vertex3f ponto0
				vertex3f ponto6
				vertex3f ponto7
				vertex3f ponto1
			-- cima2
			renderPrimitive Quads $ do
				vertex3f ponto4
				vertex3f ponto10
				vertex3f ponto11
				vertex3f ponto5
			-- meio1
			renderPrimitive Quads $ do
				vertex3f ponto1
				vertex3f ponto7
				vertex3f ponto8
				vertex3f ponto2
			-- meio2
			renderPrimitive Quads $ do
				vertex3f ponto4
				vertex3f ponto10
				vertex3f ponto9
				vertex3f ponto3
	shadeModel $= Flat
	return listaUla